﻿using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Net; 
using System.Globalization;

namespace HCCapture 
{ 
  
    public class FtpWeb 
    { 
        string ftpServerIP; 
        string ftpRemotePath; 
        string ftpUserID; 
        string ftpPassword; 
        string ftpURI; 
  
        /// <summary> 
        /// 连接FTP 
        /// </summary> 
        /// <param name="FtpServerIP">FTP连接地址</param> 
        /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param> 
        /// <param name="FtpUserID">用户名</param> 
        /// <param name="FtpPassword">密码</param> 
        public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword) 
        { 
            ftpServerIP = FtpServerIP; 
            ftpRemotePath = FtpRemotePath; 
            ftpUserID = FtpUserID; 
            ftpPassword = FtpPassword;
            ftpURI = "ftp://" + ftpServerIP + "/";
            ftpURI += !string.IsNullOrEmpty(ftpRemotePath.Trim()) ? ftpRemotePath + "/" : "";
        } 
  
        /// <summary> 
        /// 上传 
        /// </summary> 
        /// <param name="filename"></param> 
        public void Upload(string filename) 
        { 
            FileInfo fileInf = new FileInfo(filename); 
            string uri = ftpURI + fileInf.Name; 
            FtpWebRequest reqFTP; 
  
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
            reqFTP.KeepAlive = true;
            reqFTP.UsePassive = true;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
            reqFTP.UseBinary = true; 
            reqFTP.ContentLength = fileInf.Length; 
            int buffLength = 2048; 
            byte[] buff = new byte[buffLength]; 
            int contentLen; 
            FileStream fs = fileInf.OpenRead();
            try
            {
                using (Stream strm = reqFTP.GetRequestStream())
                {
                    contentLen = fs.Read(buff, 0, buffLength);
                    while (contentLen != 0)
                    {
                        strm.Write(buff, 0, contentLen);
                        contentLen = fs.Read(buff, 0, buffLength);
                    }
                    strm.Close();
                    fs.Close();
                }
            }
            catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert("FtpWeb", "Upload Error --> " + ex.Message);
            }
            finally {
                fs.Close();
            }
        }

        /// <summary> 
        /// 上传 
        /// </summary> 
        /// <param name="filename"></param> 
        public void Upload(string filename, byte[] buff, int rtnSize)
        {
            //FileInfo fileInf = new FileInfo(filename);
            string uri = ftpURI + filename;
            FtpWebRequest reqFTP;

            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.KeepAlive = true;
            reqFTP.UsePassive = true;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = rtnSize;
            try
            {
                using (Stream strm = reqFTP.GetRequestStream())
                {
                    int contentLen = rtnSize < 2048 ? rtnSize : 2048;
                    int startIndex = 0;
                    while (startIndex < rtnSize)
                    {
                        strm.Write(buff, startIndex, contentLen);
                        startIndex += 2048;
                        contentLen = (rtnSize - startIndex) < 2048 ? (rtnSize - startIndex) : 2048;
                    }
                }
            }
            catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert("FtpWeb", "Upload Error --> " + ex.Message);
            }
            finally
            {}
        } 
  
        /// <summary> 
        /// 下载 
        /// </summary> 
        /// <param name="filePath"></param> 
        /// <param name="fileName"></param> 
        public void Download(string filePath, string fileName) 
        { 
            FtpWebRequest reqFTP; 
            try
            { 
                FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); 
  
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName)); 
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; 
                reqFTP.UseBinary = true; 
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
                Stream ftpStream = response.GetResponseStream(); 
                long cl = response.ContentLength; 
                int bufferSize = 2048; 
                int readCount; 
                byte[] buffer = new byte[bufferSize]; 
  
                readCount = ftpStream.Read(buffer, 0, bufferSize); 
                while (readCount > 0) 
                { 
                    outputStream.Write(buffer, 0, readCount); 
                    readCount = ftpStream.Read(buffer, 0, bufferSize); 
                } 
  
                ftpStream.Close(); 
                outputStream.Close(); 
                response.Close(); 
            } 
            catch (Exception ex) 
            { 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "Download Error --> " + ex.Message); 
            } 
        } 
  
  
        /// <summary> 
        /// 删除文件 
        /// </summary> 
        /// <param name="fileName"></param> 
        public void Delete(string fileName) 
        { 
            try
            { 
                string uri = ftpURI + fileName; 
                FtpWebRequest reqFTP; 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
  
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                reqFTP.KeepAlive = false; 
                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; 
  
                string result = String.Empty; 
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
                long size = response.ContentLength; 
                Stream datastream = response.GetResponseStream(); 
                StreamReader sr = new StreamReader(datastream); 
                result = sr.ReadToEnd(); 
                sr.Close(); 
                datastream.Close(); 
                response.Close(); 
            } 
            catch (Exception ex) 
            { 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "Delete Error --> " + ex.Message + "  文件名:" + fileName); 
            } 
        } 
  
        /// <summary> 
        /// 删除文件夹 
        /// </summary> 
        /// <param name="folderName"></param> 
        public void RemoveDirectory(string folderName) 
        { 
            try
            { 
                string uri = ftpURI + folderName; 
                FtpWebRequest reqFTP; 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
  
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                reqFTP.KeepAlive = false; 
                reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory; 
  
                string result = String.Empty; 
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
                long size = response.ContentLength; 
                Stream datastream = response.GetResponseStream(); 
                StreamReader sr = new StreamReader(datastream); 
                result = sr.ReadToEnd(); 
                sr.Close(); 
                datastream.Close(); 
                response.Close(); 
            } 
            catch (Exception ex) 
            { 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "Delete Error --> " + ex.Message + "  文件名:" + folderName); 
            } 
        } 
  
        /// <summary> 
        /// 获取当前目录下明细(包含文件和文件夹) 
        /// </summary> 
        /// <returns></returns> 
        public string[] GetFilesDetailList() 
        { 
            string[] downloadFiles; 
            try
            { 
                StringBuilder result = new StringBuilder(); 
                FtpWebRequest ftp; 
                ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI)); 
                ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                ftp.KeepAlive = true;
                ftp.UsePassive = true;
                WebResponse response = ftp.GetResponse(); 
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); 
  
                //while (reader.Read() > 0) 
                //{ 
  
                //} 
                string line = reader.ReadLine(); 
                //line = reader.ReadLine(); 
                //line = reader.ReadLine(); 
  
                while (line != null) 
                { 
                    result.Append(line); 
                    result.Append("\n"); 
                    line = reader.ReadLine(); 
                } 
                int startIndex = result.ToString().LastIndexOf("\n");
                if(startIndex<0)
                    startIndex = 0;
                result.Remove(startIndex, 1); 
                reader.Close(); 
                response.Close(); 
                return result.ToString().Split('\n'); 
            } 
            catch (Exception ex) 
            { 
                downloadFiles = null; 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFilesDetailList Error --> " + ex.Message); 
                return downloadFiles; 
            } 
        } 
  
        /// <summary> 
        /// 获取当前目录下文件列表(仅文件) 
        /// </summary> 
        /// <returns></returns> 
        public string[] GetFileList(string mask) 
        { 
            string[] downloadFiles; 
            StringBuilder result = new StringBuilder(); 
            FtpWebRequest reqFTP; 
            try
            { 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI)); 
                reqFTP.UseBinary = true; 
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; 
                WebResponse response = reqFTP.GetResponse(); 
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); 
  
                string line = reader.ReadLine(); 
                while (line != null) 
                { 
                    if (mask.Trim() != string.Empty && mask.Trim() != "*.*") 
                    { 
  
                        string mask_ = mask.Substring(0, mask.IndexOf("*")); 
                        if (line.Substring(0, mask_.Length) == mask_) 
                        { 
                            result.Append(line); 
                            result.Append("\n"); 
                        } 
                    } 
                    else
                    { 
                        result.Append(line); 
                        result.Append("\n"); 
                    } 
                    line = reader.ReadLine(); 
                } 
                result.Remove(result.ToString().LastIndexOf('\n'), 1); 
                reader.Close(); 
                response.Close(); 
                return result.ToString().Split('\n'); 
            } 
            catch (Exception ex) 
            { 
                downloadFiles = null; 
                if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如，未找到文件，无法访问文件)。") 
                { 
                    Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileList Error --> " + ex.Message.ToString()); 
                } 
                return downloadFiles; 
            } 
        } 
  
        /// <summary> 
        /// 获取当前目录下所有的文件夹列表(仅文件夹) 
        /// </summary> 
        /// <returns></returns> 
        public string[] GetDirectoryList() 
        { 
            string[] drectory = GetFilesDetailList(); 
            string m = string.Empty;

            if (null != drectory)
            {
                foreach (string str in drectory)
                {
                    int dirPos = str.IndexOf("<DIR>");
                    if (dirPos > 0)
                    {
                        /*判断 Windows 风格*/
                        m += str.Substring(dirPos + 5).Trim() + "\n";
                    }
                    else if (str.Trim().Substring(0, 1).ToUpper() == "D")
                    {
                        /*判断 Unix 风格*/
                        string dir = str.Substring(54).Trim();
                        if (dir != "." && dir != "..")
                        {
                            m += dir + "\n";
                        }
                    }
                }
            }
            char[] n = new char[] { '\n' }; 
            return m.Split(n); 
        } 
  
        /// <summary> 
        /// 判断当前目录下指定的子目录是否存在 
        /// </summary> 
        /// <param name="RemoteDirectoryName">指定的目录名</param> 
        public bool DirectoryExist(string RemoteDirectoryName) 
        { 
            string[] dirList = GetDirectoryList(); 
            foreach (string str in dirList) 
            { 
                if (str.Trim().ToLower() == RemoteDirectoryName.Trim().ToLower()) 
                { 
                    return true; 
                } 
            } 
            return false; 
        } 
  
        /// <summary> 
        /// 判断当前目录下指定的文件是否存在 
        /// </summary> 
        /// <param name="RemoteFileName">远程文件名</param> 
        public bool FileExist(string RemoteFileName) 
        { 
            string[] fileList = GetFileList("*.*"); 
            foreach (string str in fileList) 
            { 
                if (str.Trim() == RemoteFileName.Trim()) 
                { 
                    return true; 
                } 
            } 
            return false; 
        } 
  
        /// <summary> 
        /// 创建文件夹 
        /// </summary> 
        /// <param name="dirName"></param> 
        public void MakeDir(string dirName) 
        { 
            FtpWebRequest reqFTP; 
            try
            { 
                // dirName = name of the directory to create. 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName)); 
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.KeepAlive = true;
                reqFTP.UsePassive = true;
                reqFTP.UseBinary = true; 
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
                Stream ftpStream = response.GetResponseStream(); 
  
                ftpStream.Close(); 
                response.Close(); 
            } 
            catch (Exception ex) 
            { 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "MakeDir Error --> " + ex.Message); 
            } 
        } 
  
        /// <summary> 
        /// 获取指定文件大小 
        /// </summary> 
        /// <param name="filename"></param> 
        /// <returns></returns> 
        public long GetFileSize(string filename) 
        { 
            FtpWebRequest reqFTP; 
            long fileSize = 0; 
            try
            { 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename)); 
                reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; 
                reqFTP.UseBinary = true; 
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
                Stream ftpStream = response.GetResponseStream(); 
                fileSize = response.ContentLength; 
  
                ftpStream.Close(); 
                response.Close(); 
            } 
            catch (Exception ex) 
            { 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "GetFileSize Error --> " + ex.Message); 
            } 
            return fileSize; 
        } 
  
        /// <summary> 
        /// 改名 
        /// </summary> 
        /// <param name="currentFilename"></param> 
        /// <param name="newFilename"></param> 
        public void ReName(string currentFilename, string newFilename) 
        { 
            FtpWebRequest reqFTP; 
            try
            { 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename)); 
                reqFTP.Method = WebRequestMethods.Ftp.Rename; 
                reqFTP.RenameTo = newFilename; 
                reqFTP.UseBinary = true; 
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
                Stream ftpStream = response.GetResponseStream(); 
  
                ftpStream.Close(); 
                response.Close(); 
            } 
            catch (Exception ex) 
            { 
                Insert_Standard_ErrorLog.Insert("FtpWeb", "ReName Error --> " + ex.Message); 
            } 
        } 
  
        /// <summary> 
        /// 移动文件 
        /// </summary> 
        /// <param name="currentFilename"></param> 
        /// <param name="newFilename"></param> 
        public void MovieFile(string currentFilename, string newDirectory) 
        { 
            ReName(currentFilename, newDirectory); 
        } 
  
        /// <summary> 
        /// 切换当前目录 
        /// </summary> 
        /// <param name="DirectoryName"></param> 
        /// <param name="IsRoot">true 绝对路径   false 相对路径</param> 
        public void GotoDirectory(string DirectoryName, bool IsRoot) 
        {
            ftpRemotePath = string.IsNullOrWhiteSpace(ftpRemotePath) ? "" : ftpRemotePath.TrimEnd('/') + "/";
            if (IsRoot) 
            { 
                ftpRemotePath = DirectoryName; 
            } 
            else
            { 
                ftpRemotePath += DirectoryName; 
            } 
            ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; 
        } 
  
        /// <summary> 
        /// 删除订单目录 
        /// </summary> 
        /// <param name="ftpServerIP">FTP 主机地址</param> 
        /// <param name="folderToDelete">FTP 用户名</param> 
        /// <param name="ftpUserID">FTP 用户名</param> 
        /// <param name="ftpPassword">FTP 密码</param> 
        public static void DeleteOrderDirectory(string ftpServerIP, string folderToDelete, string ftpUserID, string ftpPassword) 
        { 
            try{ 
                if (!string.IsNullOrEmpty(ftpServerIP) && !string.IsNullOrEmpty(folderToDelete) && !string.IsNullOrEmpty(ftpUserID) && !string.IsNullOrEmpty(ftpPassword)) 
                { 
                    FtpWeb fw = new FtpWeb(ftpServerIP, folderToDelete, ftpUserID, ftpPassword); 
                    //进入订单目录 
                    fw.GotoDirectory(folderToDelete, true); 
                    //获取规格目录 
                    string[] folders = fw.GetDirectoryList(); 
                    foreach (string folder in folders) 
                    {  
                        if (!string.IsNullOrEmpty(folder) || folder != "") 
                        { 
                            //进入订单目录 
                            string subFolder = folderToDelete + "/" + folder; 
                            fw.GotoDirectory(subFolder, true); 
                            //获取文件列表 
                            string[] files = fw.GetFileList("*.*"); 
                            if (files != null) 
                            { 
                                //删除文件 
                                foreach (string file in files) 
                                { 
                                    fw.Delete(file); 
                                } 
                            } 
                            //删除冲印规格文件夹 
                            fw.GotoDirectory(folderToDelete, true); 
                            fw.RemoveDirectory(folder); 
                        } 
                    } 
  
                    //删除订单文件夹 
                    string parentFolder = folderToDelete.Remove(folderToDelete.LastIndexOf('/')); 
                    string orderFolder = folderToDelete.Substring(folderToDelete.LastIndexOf('/') + 1); 
                    fw.GotoDirectory(parentFolder, true); 
                    fw.RemoveDirectory(orderFolder); 
                } 
                else
                { 
                    throw new Exception("FTP 及路径不能为空！"); 
                } 
            } 
            catch(Exception ex) 
            { 
                throw new Exception("删除订单时发生错误，错误信息为：" + ex.Message); 
            } 
        } 
    } 
  
  
    public class Insert_Standard_ErrorLog 
    { 
        public static void Insert(string x, string y) 
        { 
  
        } 

    }
}